iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0

準備工作

在開始介紹如何測試 repository 之前,要先帶過有使用的一些套件
本系列文章以 Rspec 作為測試用的框架,並且有使用 FactoryBot 來建立測資。

關於 Rspec 可以閱讀下列文章

關於 FactoryBot 可以閱讀下列文章

測試概念

  1. 透過 FactoryBot 建立測試資料的 aggregate
  2. 利用 Repository 中的 save 來存進 DB 中
  3. 利用 Repository 中的 find_by_identity 來拿 aggregate
  4. 預期從 Repository 拿出來的 aggregate 與 FactoryBot 建立的 aggregate 要一樣
  5. 利用 Repository 中的 destroy 刪除 aggregate
  6. 預期 DB 中沒有此筆 record

如此專案中的 repository 測試可以通用化成

# repository_spec.rb
RSpec.shared_examples 'a repository' do
  describe '.save' do
    it 'create record by entity' do
      repo.save(entity)
      actual_entity = repo.find_by_identity(identity)
      expect(actual_entity.to_h).to include(entity.to_h)
    end
  end

  describe '.destroy' do
    it 'destroy record by identity' do
      repo.save(entity)
      repo.destroy(entity)
      actual_entity = repo.find_by_identity(identity)
      expect(actual_entity).to be_nil
    end
  end
end

而 domain 內的 repository 測試則寫成

# user_repository_spec.rb
require 'rails_helper'

RSpec.describe Repositories::Order do
  it_behaves_like 'a repository' do
    let(:entity) { build_entity }
    let(:identity) { build_identity }
    let(:repo) { described_class.new }
  end

  private

  def build_entity
    create(
      :entity_order,
      serial_number: 'ABC-1234567890',
			status: :refunded,
			puchased_at: Time.zone.now,
			comment: '測試',
    )
  end

  def build_identity
    {
      serial_number: 'ABC-1234567890',
    }
  end
end

# factory/order.rb
FactoryBot.define do
  factory :entity_order, class: 'Entities::Order' do
    serial_number { nil }
    statu s{ nil }
    puchased_at { nil }
    comment { nil }

    skip_create
    initialize_with { new(attributes) }
  end

這樣一來,只需要定義好 entity 測資,便可以快速地建立測試,降低建立基礎建設的時間。

下一篇將分享團隊討論過關於 DAL 的問題,以及目前的結論。


上一篇
[Day15] Boxenn 實作 Repository & Query
下一篇
[DAY17] 關於 DAL 的一些問題
系列文
在 Ruby on Rails 中導入 Domain-Driven Design 是不是搞錯了什麼?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言